home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / asm / utils / paddle / paddle.alp < prev    next >
Text File  |  1980-01-03  |  5KB  |  214 lines

  1. ;*
  2. ;
  3. ; ### Paddle routines by JM v 0.50 ###
  4. ;
  5. ; - Created 900715 by JM -
  6. ;
  7. ;
  8. ; This program reads paddles connected to mouse port #2.
  9. ;
  10. ;
  11. ; Bugs: yet unknown
  12. ;
  13. ;
  14. ; Edited:
  15. ;
  16. ; - 900715 by JM -> v0.01    - Basics from vertb.asm.
  17. ; - 900716 by JM -> v0.02    - Should work but worketh not.
  18. ; - 900717 by JM -> v0.50    - Worketh.  Needed a call to WritePotgo().
  19. ;
  20. ;
  21.  
  22.     include    "bb.i"
  23.     include    "exec/types.i"
  24.     include    "exec/execbase.i"
  25.     include    "exec/tasks.i"
  26.     include    "exec/nodes.i"
  27.     include    "exec/memory.i"
  28.     include    "exec/io.i"
  29.     include    "exec/interrupts.i"
  30.     include    "hardware/intbits.i"
  31.     include    "hardware/custom.i"
  32.     include    "libraries/dos.i"
  33.  
  34.  
  35. OUTRY    equ    1<<15
  36. DATRY    equ    1<<14
  37. OUTRX    equ    1<<13
  38. DATRX    equ    1<<12
  39.  
  40. OUTLY    equ    1<<11
  41. DATLY    equ    1<<10
  42. OUTLX    equ    1<<9
  43. DATLX    equ    1<<8
  44.  
  45. START    equ    1
  46.  
  47.  
  48.  STRUCTURE mv_VERTB,0                ; oma muuttuja-alue
  49.    APTR    mv_maintask                ; paaohjelman task-osoite
  50.    APTR    mv_potgores                ; resourcen osoite
  51.    ULONG   mv_sigmask                ; signaalimaski
  52.    UWORD   mv_potdata                ; luettu data
  53.    UWORD   mv_firedata                ; nappuloiden tilat
  54.  LABEL mv_SIZE                    ; struktuurin koko
  55.  
  56.  
  57.     .var    global
  58.     dlibb    Dos,Potgo
  59.     dl    potbits
  60.     db    VERTB_signal,int_added
  61.  
  62.     .share    mem,#MEMF_CLEAR!MEMF_PUBLIC
  63.     dm    interrupt[IS_SIZE]
  64.     dm    data[mv_SIZE]
  65.     dm    buffer[256]
  66.  
  67. main    .begin
  68.     ra
  69.     st    VERTB_signal            ; lippu: sigbit ei varattu
  70.  
  71.     openlib    Dos,cleanup
  72.  
  73.     lea.s    "potgo.resource",a1
  74.     moveq    #0,d0
  75.     call    OpenResource            ; avataan potgo.resource
  76.     move.l    d0,.PotgoBase
  77.     beq    cleanup
  78.  
  79.     move.l    #OUTRY|DATRY|OUTRX|DATRX|START,d0 ; tarvittavat bitit
  80.     move.l    d0,d2
  81.     call    AllocPotBits
  82.     move.l    d0,potbits            ; varatut bitit
  83.     cmp.l    d0,d2
  84.     bne    cleanup                ; ei saatu kaikkia bittejä
  85.  
  86.     share    mem,cleanup            ; varataan muisti
  87.  
  88.     move.l    data,a2                ; muuttuja-alueen osoite
  89.     moveq    #-1,d0                ; mika tahansa bitti kelpaa
  90.     call    AllocSignal            ; varataan signaali
  91.     move.b    d0,VERTB_signal            ; tallennetaan bitin nro
  92.     moveq    #0,d1
  93.     bset    d0,d1                ; asetetaan sigbit-bitti
  94.     move.l    d1,mv_sigmask(a2)        ; tallennetaan signaalimaski
  95.     move.l    .PotgoBase,mv_potgores(a2)    ; resourcen osoite
  96.  
  97.     sub.l    a1,a1
  98.     call    FindTask            ; etsitaan oma task
  99.     move.l    d0,mv_maintask(a2)        ; osoite muuttujatilaan
  100.  
  101.     move.l    interrupt,a1            ; Interrupt-struktuuri
  102.     move.b    #NT_INTERRUPT,LN_TYPE(a1)    ; noden tyyppi = INTERRUPT
  103.     move.b    #1,LN_PRI(a1)            ; noden prioriteetti = 1
  104.     lea    intr_name(pc),a0        ; noden nimi
  105.     move.l    a0,LN_NAME(a1)            ; nimen osoite struktuuriin
  106.     lea.l    irqcode(pc),a0            ; keskeytysrutiinin osoite
  107.     move.l    a0,IS_CODE(a1)            ; osoite struktuuriin
  108.     move.l    a2,IS_DATA(a1)            ; muuttuja-alueen osoite
  109.     moveq    #INTB_VERTB,d0            ; keskeytyksen tyyppi
  110.     call    AddIntServer            ; käynnistetään keskeytys
  111.     st    int_added
  112.  
  113. loop    moveq    #0,d0
  114.     move.b    VERTB_signal,d1            ; odotetaan keskeytyksen
  115.     bset    d1,d0                ; antamaa signaalia
  116.     moveq    #SIGBREAKB_CTRL_C,d1        ; ja CTRL+C:n painamista
  117.     bset    d1,d0
  118.     call    Wait                ; ohjelma nukkumaan
  119.     btst    #SIGBREAKB_CTRL_C,d0
  120.     bne    cleanup
  121.  
  122.     moveq    #0,d0
  123.     moveq    #0,d1
  124.     moveq    #0,d2
  125.     move.l    data,a2
  126.     move.b    mv_potdata(a2),d0
  127.     move.b    mv_potdata+1(a2),d1
  128.     move.w    mv_firedata(a2),d2
  129.  
  130.     lea.s    " Paddle value: %3.3d %3.3d  Fire: %02.2x",13,a0
  131.     move.w    d2,-(sp)
  132.     move.w    d1,-(sp)
  133.     move.w    d0,-(sp)
  134.     move.l    sp,a1
  135.  
  136.     lea.l    putch(pc),a2            ; putchar-rutiinin osoite
  137.     move.l    buffer,a3            ; tulostuspuskuri
  138.  
  139.     call    RawDoFmt            ; formatoidaan tulostus
  140.     addq.l    #6,sp                ; sp takaisin kohdalleen
  141.     move.l    a3,d2
  142.     sub.l    d2,d7                ; lasketaan rivin pituus
  143.     move.l    d7,d3
  144.  
  145.     call    Output                ; tulostustiedosto
  146.     move.l    d0,d1
  147.     beq.s    cleanup                ; nolla -> ei voida tulostaa
  148.     fcall    Write                ; tulostus
  149.  
  150.     bra    loop
  151.  
  152. putch    move.b    d0,(a3)+
  153.     move.l    a3,d7
  154.     rts
  155.  
  156. cleanup    tst.b    int_added            ; keskeytysrutiini
  157.     .if    ne                ; toiminnassa?
  158.      move.l    interrupt,a1
  159.      moveq    #INTB_VERTB,d0
  160.      call    RemIntServer            ; poistetaan keskeytykset
  161.     .end
  162.  
  163.     moveq    #0,d0
  164.     move.b    VERTB_signal,d0            ; vapautetaan signaalibitti
  165.     .if    pl                ; jos se oli varattu
  166.      call    FreeSignal
  167.     .end
  168.  
  169.     move.l    potbits,d0
  170.     .if    ne
  171.      call    FreePotBits
  172.     .end
  173.  
  174.     freesh    mem                ; vapautetaan muisti
  175.     closlib    Dos
  176.     moveq    #0,d0                ; virhekoodi = 0
  177.     .end
  178.  
  179.  
  180.  
  181. irqcode    lea    $dff000,a0            ; custom-piirit
  182.     move.w    pot1dat(a0),mv_potdata(a1)    ; luetaan paddle
  183.     move.w    joy1dat(a0),d0            ; painikkeet
  184.     move.w    d0,d1
  185.     lsr.w    #1,d1
  186.     and.w    #$0101,d1            ; muut bitit pois
  187.     eor.w    d1,d0
  188.     move.w    d0,d1
  189.     and.w    #$0003,d0            ; taas liiat pois
  190.     and.w    #$0300,d1            ; tästä myös
  191.     lsr.w    #6,d1                ; molemmat tavut samaan
  192.     or.b    d1,d0
  193.     move.w    d0,mv_firedata(a1)        ; nappuloiden tilat
  194.     move.l    mv_potgores(a1),a5        ; potgo base talteen
  195.     move.l    mv_sigmask(a1),d0        ; signaalimaski
  196.     move.l    mv_maintask(a1),a1        ; taski
  197.     call    Signal                ; annetaan signaali
  198.     move.l    a5,a6                ; potgo base
  199.     moveq    #1,d0
  200.     moveq    #1,d1                ; käynnistetään uusi muunnos
  201.     fcall    WritePotgo
  202.     moveq    #0,d0                ; tieto Execille, että
  203.     rts                    ; keskeytysketju voi jatkua
  204.  
  205.  
  206. intr_name:
  207.     dc.b    'My_Paddle_Intr',0        ; keskeytyksen nimi
  208.  
  209.     .purge
  210.  
  211.     end
  212.  
  213.  
  214.